<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>var maximumSum = function (arr) {
      var dp1 = -Infinity, // 以arr[i]结尾的不删除任何元素的最大
        dp2 = -Infinity, // 以arr[i]结尾的删除一个元素的最大，可能删除i位置，也可能删除其他位置
        max = -Infinity;
      for (let i = 0; i < arr.length; i++) {
        // 要先计算dp2再计算dp1，因为dp2会用到上一个状态的dp1
        dp2 = Math.max(
          dp1, // 删除位置i的，
          // 注意这里不需要把之前删掉的负值加上来，而是很巧妙的用到了dp1，dp1就是没有上次计算的、没有删过任何元素的、以arr[i-1]结尾的最大值
          dp2 + arr[i] // 删除其他位置的
          // 删除其他位置的，直接加上本位置的即可
        );
        dp1 = Math.max(dp1 + arr[i], arr[i]);
        max = Math.max(dp1, dp2, max);
      }
      return max;
    };
    console.log(maximumSum([1, -2, 0, 3]))
  </script>
</body>

</html>